package com.chenjt.jvm.first.four_stack.DynamicLinking;

/**
 * 注释：解析调用中非虚方法、虚方法的测试
 *
 * invokestatic指令和invokespecial指令调用的方法称为非虚方法
 *
 * @author chenjt
 * @date 2025/6/6 14:42
 */

class Father{
    public Father(){
        System.out.println("father的构造器");
    }

    public static void showStatic(String str){
        System.out.println("father " + str);
    }

    public final void showFinal(){
        System.out.println("father show final");
    }

    public void showCommon(){
        System.out.println("father 普通方法");
    }

}

public class Son extends Father{
    public Son(){
        // invokespecial
        super();
    }
    public Son(int age){
        // invokespecial
        this();
    }
    // 不是重写的父类的静态方法，因为静态方法不能被重写
    public static void showStatic(String str){
        System.out.println("son " + str);
    }

    private void showPrivate(String str){
        System.out.println("son private " + str);
    }

    public void show(){
        // invokestatic
        showStatic("chenjt.com");
        // invokestatic
        super.showStatic("yes");
        // invokespecial
        showPrivate("hello");
        // invokespecial
        super.showCommon();


        /**
         * 此方法声明为final，不能被子类重写，
         * 虽然是invokevirtual，但是这里也认为是非虚方法
         * 如果这里是super.showFinal()，字节码文件里
         * 的指令就是invokespecial
         */
        // invokevirtual
        showFinal();
        // invokevirtual
        showCommon();
        // invokevirtual
        info();


        MethodInterface in = null;
        // invokeinterface
        in.methodA();

    }

    public void info(){

    }

    public void display(Father f){
        f.showCommon();
    }

    public static void main(String[] args) {
        Son son = new Son();
        son.show();
    }

}

interface MethodInterface{
    void methodA();
}
